// +----------------------------------------------------------------------
/**
 * 请求GET参数固定[自动获取]，只需要配置检查更新地址
*  https://www.xxx.com/update?app_id=`{app_id}`&version=`{version}`&version_code=`{version_code}`
*
***********************************************************************************************************
 * 服务器接收参数返回下如数据
  {
    "id": 1,
    "app_id": "__UNI__CD5910C",  //重要 [键名一致]
    "name": "狮慧娱乐",
    "version": "1.0.4",   //重要 [键名一致]
    "version_code": "104",  //重要 [键名一致]
    "android_uri": "https://ad-my.fsshihui.com/__UNI__CD5910C__v1.0.1.apk", //重要 [键名一致]
    "ios_uri": "", //重要 [键名一致]
	"is_force":0,  //重要[强制更新服务器指定：0否，1是]
    "update_time": "2025-03-14 12:00:00"
}
*
*************************************************************************************************************
在 App.vue 中全局调用
<script>
import { update } from '@/utils/AppUpdate.js'
onLaunch:(()=>{
	// 更新检查
	// #ifdef APP-PLUS
	 update().updateTime=0; //随时更新
	 update().updateUri='https://ad-my.fsshihui.com/appapi/appupdate/version'; // 检查更新地址
	 update().version();
	// #endif
}),	
</script>
 */
// +----------------------------------------------------------------------
import {DownProgress} from '@/utils/DownProgress.js'
class AppUpdate {
	// 下载定时器
	#downTime=null;
    constructor(){
		// 更新定检查周期[如果为0每次app.vue onLaunch() 方法执行一次检查]
		this.updateTime=0;
		// 更新检查URI
		this.updateUri='';
	}
	version(){
		// 指定检查周期
		if(this.updateTime > 0){
			if(!this.#isUpdate()) return;
		}
		plus.runtime.getProperty(plus.runtime.appid, (info)=> {
			uni.request({
				header:{},
				url:this.updateUri,
				method:'GET',
				data:{
					app_id:info.appid,
					version:info.version,
					version_code:info.versionCode
				},
				success:({data})=>{
					if(data.app_id){
						let update_url = (plus.os.name == 'Android' ? data.android_uri : data.ios_uri);
						if(update_url){
							// 强制更新服务器指定
							if(data.is_force == 1){
								this.#download(update_url);
							}else{
								uni.showModal({
									title: '温馨提示',
									content: '发现新版本是否立即更新？',
									showCancel:true,
									success: (res)=> {
										if(res.confirm) this.#download(update_url);
									}
								});
							}
						}
					}
				}
			})
		});
	}
	/**
	 * 按一定的时间比例进行更新
	 */
	#isUpdate(){
		let time=(new Date().getTime())/1000;
		let updateTime=uni.getStorageSync('app_update_time_2541000');
		if(!updateTime) {
			updateTime=time;
			uni.setStorageSync('app_update_time_2541000',updateTime);
		}
		if((time-updateTime) >= this.updateTime){
			uni.setStorageSync('app_update_time_2541000',time);
			return true;
		}
		return false;
	}
	// 下载并安装
	#download(packageUri){
		// 保持屏幕常亮
		uni.setKeepScreenOn({keepScreenOn: true});
		clearTimeout(this.#downTime);
		//var wgtWaiting = plus.nativeUI.showWaiting("版本更新开始下载");
		var prog=new DownProgress();
		this.#downTime = setTimeout(()=>{
			var downloadTask = uni.downloadFile({
				url: packageUri,
				success: (res) => {
					if (res.statusCode === 200 ) {
						plus.runtime.install(res.tempFilePath,{},() => {
							plus.runtime.restart();
						},(e) => {
							uni.showModal({
								content: "update error [" + e.code + "]：" + e.message,
								showCancel: false,
							});
						});
					} else {
						uni.showModal({
							content: "api error update fail!",
							showCancel: false,
						});
					}
				},
				complete:(res)=>{
					//wgtWaiting.close();
					prog.close();
				}
			});
			downloadTask.onProgressUpdate((res) => {
				//wgtWaiting.setTitle('下载中...' + res.progress + '%');
				prog.progress(res.progress);
			});
		},3000);
	}
}
// 对外暴露一个创建实例的方法
var object=null;
export function update() {
	if(object != null) return object;
	object=new AppUpdate();
	return object;
}
